home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / APPEXPRT.PAK / APXPRINT.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  6KB  |  179 lines

  1. //----------------------------------------------------------------------------
  2. ##@QUERY_PRJ_NAME [[Project]]
  3. //  Project [[Project]]
  4. ##@QUERY_PRJ_COMPANY [[CompanyName]] 2
  5. ##@QUERY_PRJ_COPYRIGHT [[Copyright]] 2
  6. ##\\Copyright Copyright 2
  7. //  [[CompanyName]]
  8. //  [[Copyright]]
  9. //
  10. ##@QUERY_TARGET_NAME [[Target]]
  11. //  SUBSYSTEM:    [[Target]] Application
  12. //  FILE:         apxprint.cpp
  13. ##@QUERY_PRJ_USER [[Author]]
  14. //  AUTHOR:       [[Author]]
  15. //
  16. //  OVERVIEW
  17. //  ~~~~~~~~
  18. //  Source file for implementation of Printing.
  19. //
  20. //----------------------------------------------------------------------------
  21. #include <owl/pch.h>
  22. #include "apxprint.h"
  23.  
  24.  
  25. void TApxPrintout::GetDialogInfo(int& minPage, int& maxPage,
  26.                                  int& selFromPage, int& selToPage)
  27. {
  28. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  29.   // Calculate the total number of pages in the document. TotalPages is
  30.   // initialized in INT_MAX in the event that we cannot determine the
  31.   // number for ourselves.
  32.   //
  33.   TPrintDC* printDC = new TPrintDC( Printer->GetSetup().GetDriverName(),
  34.                                     Printer->GetSetup().GetDeviceName(),
  35.                                     Printer->GetSetup().GetOutputName(),
  36.                                     Printer->GetSetup().GetDevMode() );
  37.  
  38.   TEditFile* efWindow = TYPESAFE_DOWNCAST( Window, TEditFile );
  39.  
  40.   if( printDC && efWindow )  {
  41.     TSize pageSize( printDC->GetDeviceCaps(HORZRES),
  42.                     printDC->GetDeviceCaps(VERTRES) );
  43.  
  44.     TEXTMETRIC tm;
  45.     printDC->GetTextMetrics( tm );
  46.     int TextHeight = tm.tmHeight + tm.tmInternalLeading;
  47.  
  48.     int LinesPerPage = pageSize.cy / TextHeight;
  49.     int TotalLines = efWindow->GetNumLines();
  50.     TotalPages = TotalLines / LinesPerPage + 1; //Add one to account for any roundoff.
  51.     if(TotalPages <= 0)
  52.     TotalPages = 1;
  53.   }
  54.  
  55.   delete printDC;
  56.  
  57.   minPage = 1;
  58.   maxPage = TotalPages;
  59.   selFromPage = 0;
  60.   selToPage = 0;
  61. }
  62.  
  63.  
  64.  
  65. void TApxPrintout::BeginPage(TRect& clientR)
  66. {
  67.   TScreenDC screenDC;
  68.   TSize screenRes(screenDC.GetDeviceCaps(LOGPIXELSX),
  69.           screenDC.GetDeviceCaps(LOGPIXELSY));
  70.   TSize printRes(DC->GetDeviceCaps(LOGPIXELSX),
  71.            DC->GetDeviceCaps(LOGPIXELSY));
  72.  
  73. ##--BEGIN-- @QUERY_APPL_COMMENT == VALUE_VERBOSE
  74.   // Temporarily change the window size (so any WM_PAINT queries on the total window size (GetClientRect) is
  75.   // the window size for the WM_PAINT of the window and the printer page size when Paint is called from
  76.   // PrintPage. Notice, we don't use AdjustWindowRect because its harder and not accurate.  Instead we
  77.   // compute the difference (in pixels) between the client window and the frame window.  This difference
  78.   // is then added to the clientRect to compute the new frame window size for SetWindowPos.
  79.   //
  80. ##--END-- @QUERY_APPL_COMMENT == VALUE_VERBOSE
  81.   clientR = Window->GetClientRect();
  82.   Window->MapWindowPoints(HWND_DESKTOP, (TPoint*)&clientR, 2);
  83.  
  84. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  85.   // Compute extra X and Y pixels to bring a client window dimensions to equal the frame window.
  86.   //
  87.   OrgR = Window->GetWindowRect();
  88.   int adjX = OrgR.Width() - clientR.Width();
  89.   int adjY = OrgR.Height() - clientR.Height();
  90.  
  91. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  92.   // Conditionally scale the DC to the window so the printout will resemble the window.
  93.   //
  94.   if (Scale) {
  95.     clientR = Window->GetClientRect();
  96.     PrevMode = DC->SetMapMode(MapMode);
  97.     DC->SetViewportExt(PageSize, &OldVExt);
  98.  
  99. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  100.     // Scale window to logical page size (assumes left & top are 0)
  101.     //
  102.     clientR.right = MulDiv(PageSize.cx, screenRes.cx, printRes.cx);
  103.     clientR.bottom = MulDiv(PageSize.cy, screenRes.cy, printRes.cy);
  104.  
  105.     DC->SetWindowExt(clientR.Size(), &OldWExt);
  106.   }
  107.  
  108. ##@QUERY_APPL_COMMENT == VALUE_VERBOSE 4
  109.   // Compute the new size of the window based on the printer DC dimensions.
  110.   // Resize the window, notice position, order, and redraw are not done the window size changes but the user
  111.   // doesn't see any visible change to the window.
  112.   //
  113.   Window->SetRedraw(false);
  114.   Window->SetWindowPos(0, 0, 0, clientR.Width() + adjX, clientR.Height() + adjY,
  115.                        SWP_NOMOVE | SWP_NOREDRAW | SWP_NOZORDER| SWP_NOACTIVATE);
  116. }
  117.  
  118.  
  119. void TApxPrintout::PrintPage(int page, TRect& bandRect, unsigned)
  120. {
  121.   TRect clientR;
  122.  
  123.   BeginPage(clientR);
  124.  
  125.   if (Scale)
  126.     DC->DPtoLP(bandRect, 2);
  127.  
  128. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  129.   // Change the printer range to this current page.
  130.   //
  131.   TPrintDialog::TData& printerData = Printer->GetSetup();
  132.   int fromPg = printerData.FromPage;
  133.   int toPg = printerData.ToPage;
  134.  
  135.   printerData.FromPage = page;
  136.   printerData.ToPage = page;
  137.  
  138. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  139.   // Call the window to paint itself to the printer DC.
  140.   //
  141.   Window->Paint(*DC, false, bandRect);
  142.  
  143.   printerData.FromPage = fromPg;
  144.   printerData.ToPage = toPg;
  145.  
  146.   if (Scale)
  147.     DC->LPtoDP(bandRect, 2);
  148.  
  149.   EndPage();
  150. }
  151.  
  152.  
  153. void TApxPrintout::EndPage()
  154. {
  155. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  156.   // Resize to original window size, no one's the wiser.
  157.   //
  158.   Window->SetWindowPos(0, 0, 0, OrgR.Width(), OrgR.Height(),
  159.                SWP_NOMOVE | SWP_NOREDRAW | SWP_NOZORDER| SWP_NOACTIVATE);
  160.   Window->SetRedraw(true);
  161.  
  162. ##:@QUERY_APPL_COMMENT == VALUE_VERBOSE 2
  163.   // Restore changes made to the DC
  164.   //
  165.   if (Scale) {
  166.     DC->SetWindowExt(OldWExt);
  167.     DC->SetViewportExt(OldVExt);
  168.     DC->SetMapMode(PrevMode);
  169.   }
  170. }
  171.  
  172.  
  173. bool TApxPrintout::HasPage(int pageNumber)
  174. {
  175.   TPrintDialog::TData& printerData = Printer->GetSetup();
  176.  
  177.   return pageNumber >= printerData.MinPage && pageNumber <= printerData.MaxPage;
  178. }
  179.